package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.constant.OrgConstant;
import com.augurit.common.entity.SysCodeItem;
import com.augurit.common.syscode.convert.SysCodeConverter;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.util.lang.CollectionUtils;
import com.augurit.common.util.lang.StringUtils;

/**
 * 业务字典项DAO类
 */
@Repository
public class SysCodeItemDao extends BaseDao<SysCodeItem, Long> {

	/**
	 * 根据主键ID集合删除子项对象
	 * @param itemIds 子项ID集合
	 * @return 被删除的子项对象的类型编号列表
	 */
	public List<String> deleteByItemIds(Long... itemIds) {
		if(itemIds != null){
			Set<String> set = new HashSet();
			
			for(Long itemId : itemIds){
				SysCodeItem entity = this.get(itemId);
				
				//保存被删除的类型对象的类型编号
				set.add(entity.getTypeCode());
				
				//删除类型
				this.delete(entity);
			}
			
			return CollectionUtils.toStringList(set);
		}
		return null;
	}
	
	/**
	 * 添加多条默认业务字典项对象
	 * @param typeCode 业务字典类型编号
	 * @param itemCount 业务字典项数目
	 */
	public void add(String typeCode, int itemCount){
		if(StringUtils.isNotBlank(typeCode) && itemCount > 0){
			int i = 1;
			while(i >= 1 && i <= itemCount){
				SysCodeItem child = new SysCodeItem();
				child.setTypeCode(typeCode);
				child.setCode(i + "");
				child.setName("业务字典项" + i);
				child.setStatus(1);
				child.setSortno(i-1);
				this.save(child);
				i++;
			}
		}
	}
	
	/**
	 * 根据旧业务字典类型编号获取业务字典项列表并更新新业务字典类型编号
	 * @param oldTypeCode 旧业务字典类型编号
	 * @param newTypeCode 新业务字典类型编号
	 */
	public void updateTypeCode(String oldTypeCode, String newTypeCode){
		
		if(oldTypeCode != null && newTypeCode != null 
				&& !oldTypeCode.equals(newTypeCode)){
			
			//根据旧业务字典类型编号查找业务字典项列表
			List<SysCodeItem> list = getByTypeCode(oldTypeCode);
			for(SysCodeItem entity : list){
				entity.setTypeCode(newTypeCode);	//更新新的业务字典类型编号
				this.save(entity);
			}
		}
		
	}
	
	/**
	 * 根据业务字典类型编号删除所有业务字典项
	 * @param typeCode 业务字典类型编号
	 */
	public void deleteByTypeCode(String typeCode){
		if(StringUtils.isNotBlank(typeCode)){
			List<SysCodeItem> list = getItemsByTypeCode(typeCode);
			this.delete(list);
		}
	}
	
	/**
	 * 根据业务字典类型获取对应的字典项
	 * @param typeCode 业务字典类型编号
	 * @return业务字典项列表
	 */
	public List<SysCodeItem> getItemsByTypeCode(String typeCode){
		if(typeCode != null && typeCode.trim().length() > 0){
			String hql = "from SysCodeItem item where item.typeCode=?";
			List values = new ArrayList();
			values.add(typeCode);
			return this.find(hql, values);
		}
		return null;
	}
	
	/**
	 * 根据业务字典类型编号获取业务字典项列表
	 * @param typeCode 业务字典类型编号
	 * @return 业务字典项列表
	 */
	public List<SysCodeItem> getByTypeCode(String typeCode){
		if(typeCode != null && typeCode.trim().length() > 0){
			String hql = "select item from SysCodeType type, SysCodeItem item where type.code=item.typeCode and item.status=? and item.typeCode=? order by item.sortno";
			List values = new ArrayList();
			values.add(OrgConstant.NUM_1);
			values.add(typeCode);
			List<SysCodeItem> list = this.find(hql, values);
			return list;
		}else
			return null;
	}
	
	/**
	 * 保存业务字典项Form对象
	 * @param form 业务字典项Form对象
	 */
	public void save(SysCodeForm form){
		
		if(form != null){
			SysCodeItem entity = null;
			
			//准备VO对象
			if(form != null && form.getItemId() != null && form.getItemId()!= 0L){
				entity = this.get(form.getItemId());
			}else{
				entity = new SysCodeItem();
			}
			
			//属性值转换
			SysCodeConverter.convert(form, entity);
			
			//保存
			super.save(entity);
			
			//回填ID属性值
			form.setItemId(entity.getId());
		}
	}

}
